<?php
require_once 'protoweb/productos_protoweb.php';

/**
 * @package sisco
 * @subpackage controller
 */
class Productos extends Productos_protoweb
{
    public function create()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Get an empty object
        $data['producto'] = new Producto();

        // Message Handler
        $data['msg'] = new PwMsgHandler();
        
        // Seleccionar secciones
        $data['navbar_productos'] = 'active';
        $data['sidebar_productos_create'] = 'active';
        
        // prepare object attributes
        $this->createPrepare($data);

        // if posting, try to save the new object
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->create_save($data);
        }

        // load view
        $this->smartyview->render('producto_create.html', $data);

    } // function create

    private function create_save($data) 
    {
        // assignCreatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignCreatePost($data)) {

            // You could customize attributes here

            // Saving Object (feel free to edit)
            if ($this->saveEntity($data)) { 

                // post processing object attributes
                $this->afterCreateSuccess($data);

                // Show success message in next view
                $data['msg']->success = 'Producto creado correctamente';
                $data['msg']->persistSuccess();

                // redirects to update method
                redirect(base_url() . 'productos/update/' . $data['producto']->id . '/');
            }
            else { 
                
                // revert attributes changes if necesary
                $this->revertOnCreateError($data);

                // Append model's errors
                $data['msg']->error .= $data['producto']->error->string;
            }
        } // if assignCreatePost
    } // function create_save
     
    public function update($id)
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // get object to edit
        $data['producto'] = new Producto($id);

        // Message Handler
        $data['msg'] = new PwMsgHandler();
        
        // Seleccionar secciones
        $data['navbar_productos'] = 'active';
        $data['sidebar_productos_update'] = 'active';
        
        // prepare object attributes
        $this->updatePrepare($data);

        // if posting, try to save modifications
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->update_save($data);
        }

        // load view
        $this->smartyview->render('producto_update.html', $data);

    } // function update

    private function update_save($data) 
    {
        // assignUpdatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignUpdatePost($data)) {

            // You could customize attributes here

            // Saving Object and its relationships (feel free to edit)
            if ($this->saveEntity($data)) { 
            	// TODO: Guardo el Histórico del producto
                // ...
                
                // post processing object attributes
                $this->afterUpdateSuccess($data);

                // Show success message in next view
                $data['msg']->success = 'Producto actualizado correctamente';
                $data['msg']->persistSuccess();

                // redirects to edit
                redirect(base_url() . 'productos/update/' . $data['producto']->id . '/');
            }
            else { 
                // revert attributes changes if necesary
                $this->revertOnUpdateError($data);

                // Append model's errors
                $data['msg']->error .= $data['producto']->error->string;
            }
        } // if assignUpdatePost
    } // function update_save
    
    public function delete($id)
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // get object to delete
        $data['producto'] = new Producto($id);
        
        if ($data['producto']->delete()) {

            // delete related actions based on purpose
            $this->afterDeleteSuccess($data);

            // Show success message in next view
            $data['msg']          = new PwMsgHandler();
            $data['msg']->success = 'Producto eliminado correctamente';
            $data['msg']->persistSuccess();

            // redirects to products browser
            redirect(base_url() . 'productos/browse/');
        }
    } // function delete

    public function browse()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Message Handler
        $data['msg'] = new PwMsgHandler();

        // Seleccionar secciones
        $data['navbar_productos'] 		  = 'active';
        $data['sidebar_productos_browse'] = 'active';
        
        // get object to show
        $data['productos'] = new Producto();
        $data['productos']->get()->all;
        
        $this->smartyview->render('producto_browse.html',$data);
    } // function browse

    public function buscar_lote()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Get an empty object
        $data['producto'] = new Producto();

        // Message Handler
        $data['msg'] = new PwMsgHandler();
        
        // Seleccionar secciones
        $data['navbar_inventarios'] = 'active';
        $data['sidebar_consultas_por_lote'] = 'active';
        
        // prepare object attributes
        $this->createPrepare($data);

        // if posting, try to save the new object
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->buscar_lote_show($data);
        }

        // load view
        $this->smartyview->render('producto_buscar_lote.html', $data);

    } // function buscar_lote
    
    private function buscar_lote_show($data) 
    {
        $this->load->model('Producto');
        $id = $this->Producto->get_id_from_code($this->input->post('codigo-producto'));
        $data['producto'] = new Producto($id);
        
        $data['lote'] = new Lote($this->input->post('lotes'));
        
        $data['movimientos'] = new Movimiento();
        $data['movimientos']->select('almacen_id')->select_sum('cantidad')->where_related('productos','id',$data['producto']->id)->where_related('lotes','id',$this->input->post('lotes'))->group_by('almacen_id')->get();
                
        $data['almacenes'] = new Almacen();
        $data['almacenes']->get();
        
        // Seleccionar secciones
        $data['navbar_inventario'] 			= 'active';
        $data['sidebar_consultas_por_lote'] = 'active';
        
        // load view
        $this->smartyview->render('producto_buscar_lote_show.html', $data);
    } // function buscar_lote_show
    
    public function vencimiento_proximo($plazo = '15') 
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);
        
        $data['lote'] = new Lote();
        $data['lote']->where('fecha_vencimiento >= curdate()')->where("fecha_vencimiento <= curdate()+$plazo")->get();
                
        $lotes_array = array();
        foreach ($data['lote'] as $lote) {
            array_push($lotes_array,$lote->id);
        }
        if ($lotes_array) {
        $data['movimientos'] = new Movimiento();
        $data['movimientos']->select('almacen_id, producto_id, lote_id')->select_sum('cantidad')->where_in('lote_id',$lotes_array)->group_by('almacen_id, lote_id')->having('sum(cantidad) >0')->get();

        $data['almacenes'] = new Almacen();
        $data['almacenes']->get();
        
        $data['productos'] = new Producto();
        $data['productos']->get();
        
        $data['lotes'] = new Lote();
        $data['lotes']->get();
        
        // Seleccionar secciones
        $data['navbar_inventario'] 						 = 'active';
        $data['sidebar_consultas_por_fecha_vencimiento'] = 'active';
        
        // load view
		$this->smartyview->render('producto_vencimiento_proximo.html', $data);
        }
        else die('No hay productos próximos a vencer');
    } // function vencimiento_proximo
    
    public function detalle($codigo)
	{
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);
        
		$this->load->model('Producto');
		$id = $this->Producto->get_id_from_code($codigo);
		if ($id != 0) {
			$producto = new Producto($id);
            
            // Lotes del producto
            $lotes = new Lote();
            $lotes->where_related('productos','id',$producto->id)->get();
            $lotes_array = array();
            foreach ($lotes as $lote) {
                $tmp = array(
                    'id' => $lote->id,
                    'codigo' => $lote->codigo,
                    'fecha_vencimiento' => $lote->fecha_vencimiento
                    );
                    array_push($lotes_array,$tmp);
            }
            
            // Precio del producto
            $precio = new Precio();
            $precio->where_related('producto','id',$producto->id);
            $precio->where('fecha_desde <= curdate()');
            $precio->order_by('fecha_desde desc, valor asc'); //Si hay dos valores para la misma fecha, tomo el menor
            $precio->get(1);
            if ($precio->valor) { $precio_unitario = $precio->valor; $precio_producto = number_format($precio->valor,2,',',''); }
            else $precio_unitario = $precio_producto = '0.00';

            // Ofertas
            $oferta = new Oferta();
            $oferta_cond1 = array('tipo_oferta_id' => 1, 'identificador' => $producto->id);
            $oferta_cond2 = array('tipo_oferta_id' => 2, 'identificador' => $producto->marca->id);
            $oferta_cond3 = array('tipo_oferta_id' => 3, 'identificador' => $producto->categoria->id);
            $oferta->where('fecha_desde <= curdate()')->where('fecha_hasta >= curdate()');
            $oferta->group_start();
            $oferta->or_group_start()->where($oferta_cond1)->group_end();
            $oferta->or_group_start()->where($oferta_cond2)->group_end();
            $oferta->or_group_start()->where($oferta_cond3)->group_end();
            $oferta->group_end();
            $oferta->order_by('porcentaje desc, tipo_oferta_id asc')->get(1);
            if ($oferta->id) { $descuento = $oferta->porcentaje; $oferta_id = $oferta->id; }
            else { $descuento = 0; $oferta_id = 0; }
            
			$json = array(
                			'id' 				=> $producto->id,
 							'descripcion' 		=> $producto->descripcion, 
                            'medida' 			=> $producto->medida->simbolo,
	              			'loteable'			=> $producto->loteable,
                			'precio_unitario'	=> $precio_unitario,
                			'precio'			=> $precio_producto,
                			'descuento'			=> $descuento,
                			'oferta_id'			=> $oferta_id,
                			'lotes'				=> $lotes_array
	              		);
		}
		else
			$json = array(
							'field' => 'error', 
	                    	'value' => 'id invalido'
	              		);
		echo json_encode($json);
	}
    
    
    public function index()
    {
        $this->browse();
    }
    

	public function __construct() 
	{
		parent::__construct();
	}

} // class Productos

/* End of file productos.php */
/* Location: ./application/controllers/productos.php */